package com.example.myproject.threadDemo.synchronizedDemo;

/**
 * Created by Mj on 2018/5/23.
 */
public class synchronizedDemo {
    /**
     * java中每个对象都可以作为锁
     * 普通同步方法：锁->当前实例对象
     * 静态同步方法：锁->当前Class对象
     * 同步方法块：锁->synchronize括号中配置对象
     *
     * java锁在何方？其中存储了何信息
     * 代码块同步：monitorenter monitorexit  方法是另一种
     * JVM中，任何对象都有一个monitor与之对应，当线程执行到monitorenter时，会尝试持有该对象对应的monitor的所有权
     *
     * synchronize 使用的是存在于对象头中的锁。
     * !!!!! 通过Cpu CAS机制 获取和释放对象头中的锁，CAS机制只能锁定单个对象，而JAVA基于CAS机制实现了锁定整个对象
     * |-------------------------------------------------------------对象头-Start-------------------------------------------------------|
     * Mark Word : 对象的hashCode 分代年龄 锁标记位（运行期间，mark word 可能变化：轻量级00 重量级10 GC标记11 偏向锁01）
     * Class Metadata Address
     * Array length
     * ThreadID
     * 32位
     * |锁状态  |   23bit | 2bit| 4bit       |  1bit      |锁标志位|
     * |偏向锁  | 线程id  |Epoch|对象分代年龄|是否是偏向锁|01      |
     * |轻量级锁| 指向栈中锁记录的指针       |是否是偏向锁|00      |
     * |重量级锁| 指向互斥量(重量级锁)的指针 |是否是偏向锁|10      |
     * |GC标记  | 空                         |是否是偏向锁|11      |
     * |-------------------------------------------------------------对象头-End-------------------------------------------------------|
     *
     * 研究发现：大多数情况下，锁不仅不存在多线程竞争，而且总是由同一线程多次获得，为了让线程获得锁的代价更低而引入了偏向锁。（个人理解是为了让锁更容易获得）
     * CAS,compare and swap  https://blog.csdn.net/ls5718/article/details/52563959
     * 在java语言之前，并发就已经广泛存在并在服务器领域得到了大量的应用。所以硬件厂商老早就在芯片中加入了大量直至并发操作的原语，从而在硬件层面提升效率。在intel的CPU中，使用cmpxchg指令。
     */
}
